#include "demo1.h"

// typedef struct _GPIO {
//     uint32_t CRL;
//     uint32_t CRH;
//     uint32_t IDR;
//     uint32_t ODR;
//     uint32_t BSRR;
//     uint32_t BRR;
//     uint32_t LCKR;
// } GPIO_t; // 如果每次，都按照这种方式，进行自己定义，太麻烦

// #define pGPIOB ((GPIO_t *)0x40010C00UL) // 可以不用开辟内存

void demo1_test(void)
{
    // 要开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // 如何通过寄存器，操作GPIO

    // // 1、输出数据寄存器（找地址），操作IO
    // uint32_t *pGPIOB_CRL = 0x40010C00UL + 0x00;

    // // 设置为推挽输出模式
    // *pGPIOB_CRL |= 0x03;         // 50MHz的输出
    // *pGPIOB_CRL &= ~(0x03 << 2); // 设置为推挽输出模式

    // uint32_t *pGPIOB_ODR = 0x40010C00UL + 0x0C;

    // // *pGPIOB_ODR = 0x00;
    // *pGPIOB_ODR |= 0x01;  // 输出高电平的时候
    // *pGPIOB_ODR &= ~0x01; // 输出低电平

    // GPIO_t *pGPIOB = 0x40010C00UL; // 直接指向GPIOB的基地址
    // pGPIOB->CRL |= 0x03;         // 50MHz的输出
    // pGPIOB->CRL &= ~(0x03 << 2); // 50MHz的输出

    // while (1) {

    //     // *pGPIOB_ODR |= 0x01; // 输出高电平的时候
    //     pGPIOB->ODR |= 0x01;

    //     HAL_Delay(500);

    //     // *pGPIOB_ODR &= ~0x01; // 输出低电平
    //     pGPIOB->ODR &= ~0x01;
    //     HAL_Delay(500);
    // }

    // 按住Ctrl+鼠标左键选择对应的对象
    // GPIOB->CRL |= 0x03;         // 50MHz的输出
    // GPIOB->CRL &= ~(0x03 << 2); // 50MHz的输出

    // while (1) {

    //     // *pGPIOB_ODR |= 0x01; // 输出高电平的时候
    //     GPIOB->ODR |= 0x01;

    //     HAL_Delay(500);

    //     // *pGPIOB_ODR &= ~0x01; // 输出低电平
    //     GPIOB->ODR &= ~0x01;
    //     HAL_Delay(500);
    // }

    // 使用寄存器，来进行操作的话，是非常不方便读（不方便理解），HAL
    // GPIO_InitTypeDef GPIO_InitTypeStructure = {0};
    // GPIO_InitTypeStructure.Pin              = GPIO_PIN_0;           // 选择PIN脚
    // GPIO_InitTypeStructure.Mode             = GPIO_MODE_OUTPUT_PP;  // 推挽输出模式
    // GPIO_InitTypeStructure.Pull             = GPIO_PULLUP;          // 默认上拉
    // GPIO_InitTypeStructure.Speed            = GPIO_SPEED_FREQ_HIGH; // 速度设置

    // 在初始化的时候，就直接进行构建（如果是进行初始化的话，推荐使用HAL,但是如，是进行操作的话，寄存器是性能最强的）
    GPIO_InitTypeDef GPIO_InitTypeStructure = {
        .Pin   = GPIO_PIN_0,          // 选择PIN脚
        .Mode  = GPIO_MODE_OUTPUT_PP, // 推挽输出模式
        .Pull  = GPIO_PULLUP,         // 默认上拉
        .Speed = GPIO_SPEED_FREQ_HIGH // 速度设置
    };

    HAL_GPIO_Init(GPIOB, &GPIO_InitTypeStructure);

    while (1) {

        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 切换状态
        HAL_Delay(500);
    }
}